/**
 * 2013-10-30 xiangsf ParamUtils.java
 */

package com.fare.taluo.util.param;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang3.StringUtils;

/**
 * This class assists skin writers in getting parameters.
 */
public class ParamUtils {

	/**
     * 获得页面请求中的值
     * <p>如果获得的值为空，则返回null</p>
     * @param request
     * @param name 参数名称
     * @return 
     */
    public static String getParameter(HttpServletRequest request, String name){
    	String temp = request.getParameter(name);
    	if(StringUtils.isNotEmpty(temp)){
    		return temp.trim();
    	}
    	return null;
    }    
    /**
     * 获得页面请求中的值
     * <p>如果获得的值为空时，则返回传入的defaultValue值</p>
     * @param request
     * @param name 参数名称
     * @param defaultValue 默认返回值
     * @return 
     */
    public static String getParameter(HttpServletRequest request, String name, String defaultValue){
    	String value = defaultValue;
    	String temp = request.getParameter(name);
    	if(StringUtils.isNotEmpty(temp)){
    		value = temp.trim();
    	}
    	temp = null;
    	return value;
    }
    /**
     * 获得页面请求中的值
     * <p>如果获得的值为空时，则返回传入的defaultValue值</p>
     * @param request
     * @param name 参数名称
     * @param defaultValue 默认返回值
     * @return 值为false、off、0时返回false, 否则返回true
     */
    public static String getParameter(Map<String, String> params, String name, String defaultValue){
    	String value = defaultValue;
    	String temp = params.get(name);
    	if(StringUtils.isNotEmpty(temp)){
    		value = temp.trim();
    	}
    	temp = null;
    	return value;
    }
    /**
     * 获得页面请求中的值集合
     * <p>
     * 如果没有该参数值对象，将返回一个长度为0的型数组；
     * 当获得的值为空时，则该值为传入的defaultValue值
     * </p>
     * @param request
     * @param name 参数名称
     * @param defaultValue 默认值
     * @return 返回数组
     */
    public static String[] getParameters(HttpServletRequest request, String name, String defaultValue){
    	List<String> values = getListParameters(request,name, defaultValue) ;
    	return (String[])values.toArray(new String[]{});
    }
    /**
     * 获得页面请求中的值集合
     * <p>
     * 如果没有该参数值对象，将返回一个长度为0的型list集合；
     * 当获得的值为空时，则该值为传入的defaultValue值
     * </p>
     * @param request
     * @param name 参数名称
     * @param defaultValue 默认值
     * @return 返回型list集合
     */
    public static List<String> getListParameters(HttpServletRequest request, String name, String defaultValue){
    	List<String> values = new ArrayList<String>();
    	String[] temp = request.getParameterValues(name);
    	if(temp != null && temp.length > 0){
    		for(int i = 0 ;i < temp.length; i++){
    			if(StringUtils.isNotEmpty(temp[i])){
    				values.add(temp[i].trim());
    	    	}else{
    	    		values.add(defaultValue);
    	    	}
    		}
    	}
    	temp = null;
    	return values;
    }
    /**
     * 获得页面请求中的值集合
     * <p>
     * 如果没有该参数值对象，将返回一个长度为0的型数组；
     * 当获得的值为空时，则该值为传入的defaultValue值
     * </p>
     * @param request
     * @param name 参数名称
     * @param defaultValue 默认值
     * @return 返回数组
     */
    public static String[] getParametersStartWith(HttpServletRequest request, String namePrefix, String defaultValue){
    	List<String> values = getListParametersStartWith(request, namePrefix, defaultValue);
    	return (String[])values.toArray(new String[]{});
    }
    /**
     * 获得页面请求中的值集合
     * <p>
     * 如果没有该参数值对象，将返回一个长度为0的型list集合；
     * 当获得的值为空时，则该值为传入的defaultValue值
     * </p>
     * @param request
     * @param name 参数名称
     * @param defaultValue 默认值
     * @return 返回list集合
     */
    public static List<String> getListParametersStartWith(HttpServletRequest request, String namePrefix, String defaultValue){
    	List<String> values = new ArrayList<String>();
    	Map<String, String[]> paras = request.getParameterMap();
    	String tempKey = null;
    	String[] temp = null;
    	for(Iterator<String> names = paras.keySet().iterator(); names.hasNext();){
    		tempKey = names.next();
    		if(tempKey.startsWith(namePrefix)){//以指定的字符串开头
    			temp = paras.get(tempKey);
    			if(temp != null && temp.length > 0){
    				for(String s : temp)
    						values.add(s);
    	    	}else{
    	    		values.add(defaultValue);
    	    	}
    		}
    	}
    	tempKey = null;
    	temp = null;
    	return values;
    }

    /**
     * URL格式参数获取
     * @param request
     * @param name
     * @return
     */
    public static String getURLParameter(HttpServletRequest request, String name){
    	 try {
			return java.net.URLDecoder.decode(request.getParameter(name),"UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return null;
    }
    /**
     * URL格式参数获取
     * @param request
     * @param name
     * @param defaultValue
     * @return
     */
   public static String getURLParameter(HttpServletRequest request, String name, String defaultValue){
	   String value = defaultValue;
	   try {
		   String temp = request.getParameter(name);
		   if(StringUtils.isNotEmpty(temp))
			   value = java.net.URLDecoder.decode(temp,"UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return value;
    }
   
   /**
	 * 从Map中获取指定键对应的字符串类型的值
	 * @author zhouan, 2012-7-21
	 * @param params
	 * @param key
	 * @return
	 */
	public static String getParameterFromMap(Map params, String key, String defaultStr) {
		Object obj = params.get(key);
		if (obj instanceof Object[]) {
			Object[] values = (Object[]) obj;
			if (!values[0].toString().equals("")) 
				return values[0].toString();
		}else if (obj instanceof Object) {
			return obj.toString();
		}
		return defaultStr;
	}
	
	/**
	 * 从Map中获取指定键对应的字符串数组
	 * @author zhouan, 2012-7-21
	 * @param params
	 * @param key
	 * @return
	 */
	public static String[] getParametersFromMap(Map params, String key) {
		Object obj = params.get(key);
		if (obj instanceof String[]) {
			String[] values = (String[]) obj;
			return values;
		} else if (obj instanceof Object[]) {
			Object[] objs = (Object[]) obj;
			String[] values = new String[objs.length];
			for (int i = 0; i < values.length; i++) {
				values[i] = objs[i].toString();
			}
			return values;
		}else if (obj instanceof Object) {
			String[] values = new String[]{obj.toString()};
			return values;
		}
		return new String[0];
	}
}



